USE	business;
GO
-- jeli w bazie istnieje procedura ... 
IF OBJECT_ID('dbo.Sygnaly_ustaw') IS NOT NULL
	DROP PROC dbo.Sygnaly_ustaw;  -- ... to j usuwamy
GO

-- tworzymy now procedur ustawiajc kontekst z dwoma parametrami
CREATE PROCEDURE dbo.Sygnaly_ustaw
	@param AS BINARY(16),    -- 16-bajtowy identyfikator
	@pos   AS INT            -- pozycja, od ktrego bajtu zapisywa sygna
AS
DECLARE @syg AS VARBINARY(128);   -- deklaracja zmiennej
-- ustawienie wartoci zmiennej @syg  cig doklejany jest do istniejcego kontekstu
-- w odpowiedniej pozycji poprzez podzielenie kontekstu sesji na dwie wartoci
-- i dodanie w rodku cgu bajw @param 
SET @syg = ISNULL(SUBSTRING(CONTEXT_INFO(), 1, @pos - 1), CAST(REPLICATE(0x00, @pos-1)AS VARBINARY(128)))
+ @param + 
ISNULL(SUBSTRING(CONTEXT_INFO(), @pos + 16, 128 - 16 - @pos + 1), 0x);
-- przypisanie wartoci zmiennej do kontekstu
SET CONTEXT_INFO @syg;
GO


-- jeli istenieje procedura czyszczca kontekst ...
IF OBJECT_ID('dbo.Sygnaly_czysc') IS NOT NULL
	DROP PROC dbo.Sygnaly_czysc;   -- ... to j usuwamy
GO

-- tworzona jest nowa procedura czyszczca kontekst
CREATE PROCEDURE dbo.Sygnaly_czysc
	@param AS BINARY(16),
	@pos   AS INT
AS
DECLARE @syg AS VARBINARY(128);
-- 16 bajw w rodku kontekstu zamienianych jest na bajty puste
SET @syg = ISNULL(SUBSTRING(CONTEXT_INFO(), 1, @pos - 1), CAST(REPLICATE(0x00, @pos-1)AS VARBINARY(128)))
+ CAST(REPLICATE(0x00, 16)AS VARBINARY(128)) + 
ISNULL(SUBSTRING(CONTEXT_INFO(), @pos + 16, 128 - 16 - @pos + 1), 0x);
SET CONTEXT_INFO @syg;
GO

-- jeli istnieje procedura pobierajca kontekst ...
IF OBJECT_ID('dbo.Sygnaly_pobierz') IS NOT NULL
	DROP PROC dbo.Sygnaly_pobierz;  -- ... to j usuwamy
GO

-- tworzymy now procedur pobierajc kontekst sesji
CREATE PROCEDURE dbo.Sygnaly_pobierz
	@param AS BINARY(16) OUTPUT,   -- parametr wyjciowy
	@pos   AS INT
AS
-- wycinany jest fragment (16 bajtw od okrelonej pozycji)
SET @param = SUBSTRING(CONTEXT_INFO(), @pos, 16);
GO


-- jeli istnieje wyzwalacz na tabeli Pracownicy, to ...
IF OBJECT_ID('dbo.trg_Instrukcje') IS NOT NULL
	DROP TRIGGER dbo.trg_Instrukcje;   -- usuwamy go
GO

-- tworzymy wyzwalacz ...
CREATE TRIGGER dbo.trg_Instrukcje 
ON dbo.Pracownicy  -- ... na tabeli Pracownicy ...
FOR INSERT         -- ... na instrukcj INSERT
AS
DECLARE @sig AS BINARY(16);
EXEC dbo.Sygnaly_pobierz  -- uruchamiane jest pobieranie kontekstu ...
	@param = @sig OUTPUT,   -- ... do zmiennej @sig ...
	@pos   = 1;             -- ... od pozycji 1
-- jeli kontekst bdzie mia ponisz warto ...
IF @sig = 0x7EDBCEC523E74983451A6654F52C48E RETURN; -- to koniec triggera
PRINT 'Trigger dziaa' -- ... w przeciwnym wypadku trigger wywietli napis
GO


INSERT INTO Pracownicy VALUES ('Jan', 'Nowak', 3600, 2);
